const webpack = require('webpack');
const path = (name) => require('path').resolve(__dirname, name); //获取绝对路径

/**
 * webpack的基础配置文件
 * 中文文档：https://www.webpackjs.com/concepts/
 * @param env Node的环境变量：process.env。注意：webpack打包是在node环境中运行的。
 */
module.exports = (env) => {
  const publicParam = require('./config/config.js')(env); //项目的公共配置

  //入口文件
  let entry = './src/index.js';
  //出口文件
  let output = {
    path: path(publicParam.fileName), //出口文件的路径
    filename: 'js/[name].[hash:8].js' //出口文件的文件名。注意：因为浏览器会缓存js文件，所以使用hash名来自动更新缓存。
  };
  //指定需要解析的模块
  let resolve = {
    modules: [path('src'), 'node_modules'], //需要解析的模块
    alias: {'@': path('src')} //指定别名
  };
  //对模块的源代码进行转换。注意：webpack自身只理解JavaScript。
  let module = {
    //解析规则
    rules: [
      {
        test: /\.(png|svg|jpg|gif|pdf)$/,
        include: [path('src')],
        loader: 'url-loader', //file-loader的加强版，用于将图片转为base64，减少网络请求
        options: {
          name: 'img/[name].[hash:8].[ext]',
          limit: 8192 //将小于limit的图片，转为base64。单位为byte。
        }
      }
    ]
  };
  let plugins = [
    //定义全局变量，webpack编译后生效。'window._ENV_'：在window对象中定义_ENV_属性，开发时没警告。直接定义_ENV_时，开发时会有警告。
    new webpack.DefinePlugin({'window._ENV_': JSON.stringify(publicParam)})
  ];

  //webpack的基础配置参数
  let config = {entry, output, resolve, module, plugins};
  return config;
};
